package com.lipuwater.agent.http;


import com.google.gson.Gson;
import com.lipuwater.agent.ui.dialog.LoadingDialog;
import com.lipuwater.agent.ui.utils.ExitLoginUtils;
import com.okhttplib.OkHttpUtils;
import com.okhttplib.callback.StringCallback;

import java.util.Map;

import okhttp3.Call;
import okhttp3.MediaType;

/**
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃代码无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * Created by root on 2016/5/4  10:36.
 */
public class BaseRequest<T> {
    private static BaseRequest instance = null;
    private Gson mGson = new Gson();

    /**
     * @return
     */
    public static BaseRequest getInstance() {
        if (instance == null) {
            instance = new BaseRequest();
        }
        return instance;
    }


    /**
     * POST
     * 这里需要注意,如果返回的是405说明接口不支持post需要用get请求
     *
     * @param object   用于取消当前页面请求
     * @param url      请求URL
     * @param params   请求参数
     * @param callBack 回调
     * @param pd       dialog
     */
    public void sendRequestPost(Object object, String url, Map<String, Object> params, final ApiCallBack callBack, final LoadingDialog pd) {
        if (pd != null) {
            pd.showDialog();
        }
        /*L.i("POST: \nURL="+url);
        for( Map.Entry<String, Object> entry : params.entrySet()){
            L.i(entry.getKey()+" = "+entry.getValue().toString());
        }*/
        RequestParams requestParams = new RequestParams();
        requestParams.setParams(params);
        OkHttpUtils
                .postString()
                .url(url)
                .content(mGson.toJson(requestParams))
                .mediaType(MediaType.parse("application/json; charset=utf-8"))
                .tag(object)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        if (pd != null && pd.isShowing()) {
                            pd.dismiss();
                        }
                        if (callBack != null) {
                            //非取消的才回调出去
                            if (e.getMessage() != null) {
                                String message = e.getMessage();
                                if (!message.equals("Canceled") && !message.equals("Socket closed")) {
                                    callBack.onError(call, e);
                                }
                            } else {
                                callBack.onError(call, e);
                            }
                        }
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        if (pd != null && pd.isShowing()) {
                            pd.dismiss();
                        }
                        if (callBack != null) {
                            try {
                                ResponseParams result = mGson.fromJson(response, ResponseParams.class);
                                callBack.onResponse(result);
                                //token验证失败
                                if (result != null && result.getStatus() == HttpConfig.token_failure) {
                                    ExitLoginUtils.getInstance().exit();
                                }
                            } catch (Exception e) {
                                callBack.onError(null, e);
                            }
                        }
                    }
                });
    }


    public void sendRequestGet(Object object, String url, Map<String, String> params, final ApiCallBack callBack, final LoadingDialog pd) {
        if (pd != null) {
            pd.showDialog();
        }
        /*L.i("GET: \nURL="+url);
        for( Map.Entry<String, String> entry : params.entrySet()){
            L.i(entry.getKey()+" = "+entry.getValue());
        }*/
        OkHttpUtils
                .get()
                .url(url)
                .params(params)
                .tag(object)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        if (pd != null && pd.isShowing()) {
                            pd.dismiss();
                        }
                        if (callBack != null) {
                            callBack.onError(call, e);
                        }
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        if (pd != null && pd.isShowing()) {
                            pd.dismiss();
                        }
                        if (callBack != null) {
                            try {
                                ResponseParams result = mGson.fromJson(response, ResponseParams.class);
                                callBack.onResponse(result);
                            } catch (Exception e) {
                                callBack.onError(null, e);
                            }
                        }
                    }
                });
    }


}
